import fitz  # PyMuPDF

def extract_bookmarks_with_positions(pdf_path):
    # 打开 PDF 文件
    doc = fitz.open(pdf_path)

    # 获取书签信息
    bookmarks = doc.get_toc()

    result = []

    # 遍历书签并获取页面位置
    for bookmark in bookmarks:
        # 书签结构：[level, title, page_number]
        level, title, page_number = bookmark
        page = doc.load_page(page_number)  # 加载对应页面

        # 获取页面的文本块信息
        text_instances = page.search_for(title)  # 搜索书签标题在页面中的位置

        # 如果找到了该标题，获取它的位置
        if text_instances:
            for inst in text_instances:
                # 获取匹配文本块的位置（矩形区域）
                rect = inst  # inst 是一个矩形，包含 left, top, right, bottom
                result.append({
                    'title': title,
                    'page': page_number + 1,  # 页码从 1 开始
                    'position': {
                        'left': rect.x0,
                        'top': rect.y0,
                        'right': rect.x1,
                        'bottom': rect.y1
                    }
                })
        else:
            # 如果没有找到文本块位置，可以返回一个默认值
            result.append({
                'title': title,
                'page': page_number + 1,
                'position': None
            })

    return result

# 使用示例
pdf_path = "./rl.pdf"  # PDF 文件路径
bookmarks_with_positions = extract_bookmarks_with_positions(pdf_path)

# 打印书签信息及位置
for item in bookmarks_with_positions:
    print(f"Title: {item['title']}, Page: {item['page']}, Position: {item['position']}")
